
/*
*Pool Public Licence version 0.1 or later
*Released on 20th April 2008.
*Any voilations can be repoted at paritosh@wikiocean.net
*What is treated as voilations can be found at www.wikiocean.net/ppl1-voilations* 
******************************************************************************
* The contents of this file are subject Affero GPL v3 and later with additional conditions.
* The additional conditions are to be considered as part of the Affero GPL v3 and later.
* The additional conditions will supersede the Affero GPLv3 and later in case of conflict.
* ("License"); You may not use this file except in compliance with the License
* You may obtain a copy of the License at http://www.gnu.org/licenses/agpl.html
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
* the specific language governing rights and limitations under the License.
* The Initial Developer of the Original Code is Paritosh Pungaliya.
* created by Paritosh Pungaliya are Copyright (C) Paritosh Pungaliya; All Rights Reserved.
* Contributions are Copyright (C) 2001-2008 Paritosh Pungaliya.

* Objective of the additional terms (license) 
* 1) Is to extend the software freedom to freedom to work.
* 2) To ensure that knowledge is free from monopoly of agencie(s).
* 3) To avoid a situation where big corporates or investors can buy out free software groups and companies and then start milking the communities built around it.
* (this trend can be seen how the openness changes in companies that get Venture Capital funding.)
* (if you agree to this logic I invite you to our group to work together)

* Additional conditions
*  0) Source code will also include
* 	a) data dictionaries, data ontologies which are used to alter the behavior of code or to control           the features of application.
* 	b) Any code generated or derived automatically or manually from this code or logic
*  1) The revenue generated by deploying, implementing , selling services and other activities
*  	 based on this source code should be shared 100%, between the people working on it.
*  2) Capital invested should be given only fixed rate of return or linked to revenue/surplus growth for limited time.
*  3) People working on the project should always have an option to replace the capital provider in full or part with lower cost capital.
*  4) Their should not be any ownership which can be sold as a claim on future profit to be generated from the work of people working on the code.
*  5) Brand thus generated should belong to the group.
*  6) For old and new members revenue sharing should be equal for same work equivalent.
*  7) The share of revenue should be decided by bidding for work before allocation of work within the group.
*  8) Before bidding various method of measuring the work should be clearly defined and published in public domain. Any change in process should also be publised in public domain imediately.
*  9) All data related to to revenue sharing should be published as and when generated in public domain.
*  10) For group of people having size more than 10 people will have to make it open online for others to participate in bids. 
*  11) All people involved in related and sub project will be treated as a group.
*  12) Once this license is being used for a certain code then all and any other software services being provided by the group should complusorilly come under 100% revenue sharing.
*  13) Cross subsidization should not happen under this revenue share, no additional benefit should be drawn from the people, by the employing agency.
*  14) Any position or knowledge or legal structure created relating to people working on code, which adversely affects the spirit of 100% revenue share will be treated as a violation.
*  15) Revenue sharing defined.
*     a) includes direct revenue and also intangible gains like brand, and organization.
*     b) No personal judgment should be involved in judging the distribution of revenue.It has to be pre-defined formula based.
*     c)100% of revenue should be shared before expenses and recievers should have control over what expenses to incur.
*     d)For the work done in any month by contributing group member, working on any project can be given revenue share from the work done by the group, for a maximum of 18 months after that month.
*     e)Revenue should be apportioned to the month in which work is done and not when received.
*  The group fulfilling the above conditions also has to be a wiki ecosystem further defined in www.wekosystem.org or read about Wekosystem at www.wikiocean.net

*  ******************************************************************************
*/  
package SMS;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;

//import javax.comm.CommPortIdentifier;
////import javax.comm.SerialPort;


public class PortHandler 
{
	 private CommPortIdentifier portId;
	 private InputStream inputStream;
	 private OutputStream outputStream;
	 private SerialPort serialPort;
	 private String commport;
	 private String databits;
	 private String stopbits;
	 private String parity;
	 private String baudrate;
	
	public PortHandler(String commport, String baudrate)
	{
		this.baudrate = baudrate;
		this.commport = commport;
		 serialPort = null;
	     databits = "8";
	     stopbits = "1";
	     parity = "None";
	}
	public PortHandler() 
	{
		 serialPort = null;
	     commport = "/dev/tty0";
	     databits = "8";
	     stopbits = "1";
	     parity = "None";
	     baudrate = "115200";
	}
	
	public boolean FindComPort()
	{
	     System.out.println("FINDCOMPORT METHOD");
	     Enumeration portList = CommPortIdentifier.getPortIdentifiers();
	     while(portList.hasMoreElements()) 
	     {
	         portId = (CommPortIdentifier)portList.nextElement();
	         if(portId.getName().equals(commport))
	         {
	             System.out.println(portId.getName());
	             System.out.println("UPTO THIS");
	             initialize();
	             connect();
	             System.out.println((new StringBuilder()).append(portId.getName()).append(" is identified .").toString());
	             return true;
	         }
	     }
	     System.out.println((new StringBuilder()).append(portId.getName()).append(" is not identified .").toString());
	     return false;
	 }
	
	 public boolean initialize()
	 {
	     try
	     {
	         serialPort = (SerialPort)portId.open("GsmControl", 2000);
	         try
	         {
	             int x = 0;
	             int y = 0;
	             int z = 0;
	             if(Integer.parseInt(databits) == 7)
	                 x = 7;
	             else
	             if(Integer.parseInt(databits) == 8)
	                 x = 8;
	             if(Integer.parseInt(stopbits) == 1)
	                 y = 1;
	             else
	             if(stopbits.equalsIgnoreCase("1.5"))
	                 y = 3;
	             else
	             if(Integer.parseInt(stopbits) == 2)
	                 y = 2;
	             if(parity.equalsIgnoreCase("none"))
	                 z = 0;
	             else
	             if(parity.equalsIgnoreCase("even"))
	                 z = 2;
	             else
	             if(parity.equalsIgnoreCase("odd"))
	                 z = 1;
	             serialPort.setSerialPortParams(Integer.parseInt(baudrate), x, y, z);
	//             serialPort;
	             serialPort.setFlowControlMode(0);
	         }
	         catch(Exception e)
	         {
	             System.out.println("ERROR IN INITIALIZATION in SendMessage.java");
	             e.printStackTrace();
	             serialPort.close();
	             return false;
	         }
	     }
	     catch(Exception e)
	     {
	    	 e.printStackTrace();
	         return false;
	     }
	     
	     try 
	     {
			inputStream = serialPort.getInputStream();
			outputStream = serialPort.getOutputStream();
		} catch (IOException e) {
			e.printStackTrace();
		}
	     return true;
	 }
	
	 public boolean connect()
	 {
	     System.out.println("CONNECT METHOD");
	     System.out.println("CONNECT METHOD1");
	     String ans1;
	     try
	     {
	         System.out.println("AT COMMAND FIRE");
	         String ans = sendAndRecv(new String("AT\r"), 100);
	         System.out.println((new StringBuilder()).append("ans==").append(ans).toString());
	         if(ans.indexOf("OK") != -1)
	         {
	             System.out.println("Connected");
	         } else
	         {
	             serialPort.close();
	             inputStream.close();
	             outputStream.close();
	             return false;
	         }
	     }
	     catch(Exception e)
	     {
	         e.printStackTrace();
	         serialPort.close();
	         return false;
	     }
	     ans1 = sendAndRecv(new String("AT+CMGF=1\r"), 100);
	     if(ans1.indexOf("OK") == -1);
	     return true;
	 }

	 public void disConnet()
	 {
	     try
	     {
	         System.out.println("Discconnect method is called.");
	         serialPort.close();
	         inputStream.close();
	         outputStream.close();
	     }
	     catch(Exception e)
	     {
	         e.printStackTrace();
	     }
	 }
	 
	public String sendAndRecv(String s, int timeout)
	 {
	     String strIn;
	     try
	     {
	    	 inputStream.skip(inputStream.available());
	         System.out.println("THIS IS SEND AND RECEVIEMETHOD");
	         s = (new StringBuilder()).append(s).append("\r").toString();
	         System.out.println((new StringBuilder()).append("COMMAND TO ISSUE==").append(s).toString());
	         outputStream.write(s.getBytes());
	         outputStream.flush();
	         System.out.println("COMMAND TO ISSUE1");
	         strIn = new String();
	         int i = 0;
	         do
	         {
	             if(i >= timeout)
	                 break;
	             int numChars = inputStream.available();
	             if(numChars > 0)
	             {
	                 byte bb[] = new byte[numChars];
	                 inputStream.read(bb, 0, numChars);
	                 strIn = (new StringBuilder()).append(strIn).append(new String(bb)).toString();
	             }
	             System.out.println((new StringBuilder()).append("RESPONSE===").append(strIn).toString());
	             if(strIn.indexOf(">\r\n") != -1 || strIn.indexOf("OK\r\n") != -1 || strIn.indexOf("ERROR") != -1 && strIn.indexOf("\r\n", strIn.indexOf("ERROR") + 1) != -1)
	                 break;
	             Thread.sleep(100);
	             i++;
	         } while(true);
	         if(strIn.length() == 0)
	             return "ERROR: len 0";
	     }
	     catch(Exception e)
	     {
	         e.printStackTrace();
	         try
	         {
	             for(boolean tempFlag = false; !tempFlag; tempFlag = connect())
	             {
	                 Thread.sleep(5000L);
	                 disConnet();
	                 initialize();
	             }
	         }
	         catch(Exception ie)
	         {
	             e.printStackTrace();
	         }
	         return "ERROR: send e recv Exception";
	     }
	     return strIn;
	 }
	

}
